enum ins_type {
    INS_VAR = 0,
    INS_ASGN,
    // 以下指令JIT可编译
    INS_CAST,
    INS_LI,
    INS_ADDI,
    INS_SLTI,
    INS_SLTIU,
    INS_XORI,
    INS_ORI,
    INS_ANDI,
    INS_SLLI,
    INS_SRLI,
    INS_SRAI,
    INS_ADD,
    INS_SUB,
    INS_SLL,
    INS_SLT,
    INS_SLTU,
    INS_XOR,
    INS_SRL,
    INS_SRA,
    INS_OR,
    INS_AND,
    INS_NOT,
    INS_LDI,
    INS_STI,
    INS_LD,
    INS_ST,
    INS_MV,
    // 以下指令JIT无法编译
    INS_ECALL,
    INS_B,
    INS_BEQ,
    INS_BNE,
    INS_BLT,
    INS_BGE,
    INS_CALL,
    INS_RET,
    INS_END, // 注意end在这里看作指令,约定最后一个指令是end
    // 指令结束
    INS_NUM
};

enum rtc_type {
    RTC_BEGIN = 0,
    RTC_END,
    RTC_RT,
    RTC_JIT,
    RTC_INVALID
};

enum var_type {
    VAR_UNDEF = 0, // UNDEF按i64处理
    VAR_I8, // 1
    VAR_U8,
    VAR_I16,
    VAR_U16,
    VAR_I32,
    VAR_U32,
    VAR_I64,
    VAR_U64,
    VAR_STR,
    VAR_SPACE,
    VAR_INVALID
};

enum iadr_type { // 间址类型
    IDAR_UNDEF = 0, // pad
    IADR_I8,
    IADR_I16,
    IADR_I32,
    IADR_I64,
    IADR_U8,
    IADR_U16,
    IADR_U32,
    IADR_U64,
};

struct stfunc { //函数
    char *name;
    // uint addr;
};

struct stlbl {
    // struct stfunc * fn;
    char *name;
    // uint addr;
};

struct strtc {
    enum rtc_type type;
};

struct stvar {
    // enum var_type type;
    char * name;
};

enum reg_nm {
    X_A0 = 0,
    X_A1,
    X_A2,
    X_A3,
    X_T0,
    X_T1,
    X_T2,
    X_T3,
    X_T4,
    X_T5,
    X_T6,
    X_T7,
    X_FP,
    X_RA,
    X_PC,
    X_NUM,
    X_INVALID
};

struct stins {
    enum ins_type type;
    // struct stvar * var;
    // struct stasgn * asgn;
    char * varname; // 变量名
    enum reg_nm rd;
    enum reg_nm rs1;
    enum reg_nm rs2;
    enum var_type vartype; // asgn var type在此
    char * lbl; // 附加标签
    char * func; // 附加函数名
    char * str; // asgn指令使用
    int64 imm;
};

enum syntax_type {
    SYN_RTC = 0, // 运行时控制
    SYN_FUNC, // 函数 
    SYN_LBL, // 局部标签
    SYN_INS, // 指令
    SYN_VAR,
    // SYN_ASGN
};

struct syntaxelem {
    enum syntax_type type;
    union {
        struct stfunc func;
        struct stlbl lbl;
        struct strtc rtc;
        struct stvar var;
        struct stins ins;
    } synt;
};


struct syntaxlist {
#define MAX_NRSTELEM 10240 //最多10240条汇编器语句 
    uint sz;
    struct syntaxelem ste[MAX_NRSTELEM];
};